package taller.dataLayer.managers;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import taller.dataLayer.entities.SolicitudCotizacion;
import taller.dataLayer.vo.CotizacionVO;
import taller.dataLayer.vo.SolicitudCotizacionVO;
import taller.excepcion.ParserException;
import taller.integrationLayer.caller.EmisorSolicitudCotizacion;

@Stateless
public class AdministradorSolicitudesCotizacionBean implements AdministradorSolicitudesCotizacion {
	@PersistenceContext(name="taller14")
	EntityManager entityManager;
	
	@EJB(beanName="AdministradorCotizacionesBean")
	private AdministradorCotizaciones adminCotizaciones;
	
	@EJB(beanName="AdministradorParametrosBean")
	private AdministradorParametros adminParam;
	
	@EJB(beanName="EmisorSolicitudCotizacionBean")
	private EmisorSolicitudCotizacion emisorCotizador;
	
    public AdministradorSolicitudesCotizacionBean() {
    }

    public void guardar(SolicitudCotizacionVO solicitudCotizacion) {
    	solicitudCotizacion.setNumeroTaller(adminParam.getNumeroTaller());
    	SolicitudCotizacion solicitudCotizacionEB = new SolicitudCotizacion();
    	solicitudCotizacionEB.setVO(solicitudCotizacion);
    	
    	if (solicitudCotizacion.getNumero() != null && this.buscar(solicitudCotizacion) != null) {
			entityManager.merge(solicitudCotizacionEB);
		} else {
			solicitudCotizacionEB.setFecha(new Date());
	    	//solicitudCotizacionEB.setNumeroTaller(adminParam.getNumeroTaller());
	    	solicitudCotizacionEB.setNumero(null);
	    	
			entityManager.persist(solicitudCotizacionEB);
			solicitudCotizacion.setNumero(solicitudCotizacionEB.getNumero());
		}
    }
    
    public CotizacionVO guardarNuevaSolicitudYCotizar(SolicitudCotizacionVO solicitudCotizacion) 
    		throws RemoteException, ParserException {
    	
    	this.guardar(solicitudCotizacion);

    	CotizacionVO nuevaCotizacion = emisorCotizador.enviarSolicitudCotizacion(solicitudCotizacion);
    	adminCotizaciones.guardar(nuevaCotizacion);
    	
    	return nuevaCotizacion;
    }
    
	public SolicitudCotizacionVO buscar(SolicitudCotizacionVO solicitudCotizacion) {
		SolicitudCotizacion retVal = (SolicitudCotizacion) entityManager.find(SolicitudCotizacion.class, solicitudCotizacion.getNumero());
		return retVal != null? retVal.getVO() : null;
	}
	
	@SuppressWarnings("unchecked")
	public List<SolicitudCotizacionVO> buscarTodas() {
		List<SolicitudCotizacion> solicitudes = entityManager.createQuery("from SolicitudCotizacion").getResultList();
		List<SolicitudCotizacionVO> solicitudesVO = new ArrayList<SolicitudCotizacionVO>();
		Iterator<SolicitudCotizacion> i = solicitudes.iterator();
		while(i.hasNext()){
			SolicitudCotizacionVO solicitud = new SolicitudCotizacionVO();
			solicitud = i.next().getVO();
			solicitudesVO.add(solicitud);
		}
		
		return solicitudesVO;
	}
}
